#pragma once

#include <string>
#include "module_define.hh"

namespace kratos { namespace engine {

class Service;

// Module loader
class Module {
    ModuleHandle handle_; // Module file handle
    Service* service_; // export function
    std::string name_; // Module name
    ModuleType type_; // Module type

public:
    Module(const Module&) = delete;
    const Module& operator=(const Module&) = delete;
    // ctor
    Module();
    // rvalue copy
    Module(Module&& rht);
    // dtor
    ~Module();
    // Load module
    // @param name Module name
    // @retval true
    // @retval false fails
    bool load(const std::string& name);
    // Unload module
    // @retval true
    // @retval false fail
    bool unload();
    // Stop module
    // @retval true
    // @retval false fail
    bool stop();
    // Uninstall module
    // @retval true
    // @retval false fail
    bool uninstall();
    // returns module's service instance
    // @return module's service
    Service* getService();
    // boolean
    operator bool();
    // Returns module type
    ModuleType getModuleType();
    // Clear the service address
    void clearService();
    // Unload forcelly
    void forceUnload();
    // Setup service name
    void setServiceName(const std::string& serviceName);
};


}}
